﻿/**
 *
 * @file   FITKCCXAdaptorCase.h
 * @brief  Calculix 适配器 用于读取INP文件和写出INP文件。
 * @author XuChao (xxu715737@163.com)
 * @date   2024-05-23
 *
 */
#ifndef  __FITKCCXADAPTOR_CASE_H___
#define __FITKCCXADAPTOR_CASE_H___

#include "FITKCCXAbstractAdaptor.h"
#include "FITKCCXModelInforManager.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

// 前置声明
ForwardDeclarNS(AbaqusData, FITKAbaqusPart)
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaMaterial)
ForwardDeclarNS(Interface, FITKAbaAssembly)
ForwardDeclarNS(Interface, FITKAbaAbstractStep)
ForwardDeclarNS(Interface, FITKAbaAbstractAmplitude)

namespace IO
{

    class FITKCCXAdaptorCase : public FITKCCXAbstractAdaptor
    {
    public:
        explicit FITKCCXAdaptorCase() = default;
        ~FITKCCXAdaptorCase() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        QString getAdaptorClass() override;

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        bool adaptW() override;

    private:
        /**
         * @brief  写出heading信息
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-23
         */
        bool writeHeading();

        /**
         * @brief  处理写出model信息
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-05-23
         */
        bool writeModel(Interface::FITKAbaAssembly* assembly);

        /**
         * @brief  写出约束
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-03
         */
        bool writeCCXConstraint();

        /** 
         * @brief  写出幅值(Amplitude)曲线
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-02
         */
        bool writeAmplitude(Interface::FITKAbaAbstractAmplitude* amplitude);

        /** 
         * @brief  写出Material结构
         * @param  material 材料
         * @return 状态 true成功， false失败 
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-02
         */
        bool writeCCXMaterial(Interface::FITKAbaMaterial* material);

        /**
         * @brief 写出相互作用属性
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-02
         */
        bool writeCCXInteractionProperty();

        /**
         * @brief 写出初始分析步中的边界(Boundary)条件
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-02
         */
        bool writeCCXInitialBoundary();

        /** 
         * @brief  写出相互作用
         * @return 状态 true成功， false失败
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-03
         */
        bool writeCCXInteraction();

        /**
        * @brief 写出分析步（Step）结构
        * @param step 分析步
        * @return 状态 true成功， false失败
        * @author XuChao (xxu715737@163.com)
        * @date   2024-06-03
        */
        bool writeCCXStep(Interface::FITKAbaAbstractStep* step);

        /** 
         * @brief  动态分析步中是否包含coupling约束类型
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-17
         */
        bool isBothCouplingDynamic();

    private:

        /**
         * @brief 算例数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        AbaqusData::FITKDataCase* _caseData{};

        /**
         * @brief  abaqus与calculix映射关系表
         * @author XuChao (xxu715737@163.com)
         * @date   2024-06-02
         */
        FITKCCXModelInforManager *_modelInfoManager{};
    };
    Register2FITKIOAdaptorFactory(CCXINP, AbaqusData::FITKDataCase, FITKCCXAdaptorCase);
}
#endif